"""
在文件操作、socket、数据库操作中如果不关闭资源会导致严重后果传统做法是使用try...非常繁琐
可以使用with+上下文管理器简化操作

一个类中实现enter、exit方法即实现了上下文管理器，就可以使用with
"""

# 实现上下文管理器的另一种方式使用@contextmanager
from contextlib import contextmanager


@contextmanager
def my_open(path, mode):
    f = open(path, mode)  # 相当于with后做的事情
    yield f  # 暂停执行
    f.close()  # 执行完毕、出现异常时执行


class File:
    """自定义上下文管理器应用"""

    def __init__(self, file_name, file_mode) -> None:
        super().__init__()
        self.file_name = file_name
        self.file_mode = file_mode

    def __enter__(self):
        """当创建对象时自动调用该方法"""
        print("enter")
        self.f = open(self.file_name, self.file_mode)
        return self.f

    def __exit__(self, *args):
        """无论是否遇到异常都会调用该方法"""
        print("exit")
        self.f.close()


def main():
    with File("D://xx.txt", "w") as f:
        print("write")
        f.write("xxx")


if __name__ == '__main__':
    main()
